route.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { NextRequest, NextResponse } from "next/server";
  2. import { getServerSession } from "next-auth";
  3. import { authOptions } from "@/lib/auth";
  4. import { prisma } from "@/lib/prisma";
  5. // POST /api/appointments/[id]/reject - Rechazar cita (médico)
  6. export async function POST(
  7. request: NextRequest,
  8. { params }: { params: Promise<{ id: string }> }
  9. ) {
  10. try {
  11. const { id } = await params;
  12. const session = await getServerSession(authOptions);
  13. if (!session?.user?.email) {
  14. return NextResponse.json({ error: "No autorizado" }, { status: 401 });
  15. }
  16. const user = await prisma.user.findUnique({
  17. where: { email: session.user.email },
  18. });
  19. if (!user || user.role !== "DOCTOR") {
  20. return NextResponse.json(
  21. { error: "Solo los médicos pueden rechazar citas" },
  22. { status: 403 }
  23. );
  24. }
  25. const appointment = await prisma.appointment.findUnique({
  26. where: { id },
  27. });
  28. if (!appointment) {
  29. return NextResponse.json({ error: "Cita no encontrada" }, { status: 404 });
  30. }
  31. if (appointment.estado !== "PENDIENTE") {
  32. return NextResponse.json(
  33. { error: "Solo se pueden rechazar citas pendientes" },
  34. { status: 400 }
  35. );
  36. }
  37. const body = await request.json();
  38. const { motivoRechazo } = body;
  39. if (!motivoRechazo) {
  40. return NextResponse.json(
  41. { error: "Debe proporcionar un motivo de rechazo" },
  42. { status: 400 }
  43. );
  44. }
  45. const updated = await prisma.appointment.update({
  46. where: { id },
  47. data: {
  48. estado: "RECHAZADA",
  49. medicoId: user.id,
  50. motivoRechazo,
  51. },
  52. include: {
  53. paciente: {
  54. select: {
  55. id: true,
  56. name: true,
  57. lastname: true,
  58. email: true,
  59. profileImage: true,
  60. },
  61. },
  62. medico: {
  63. select: {
  64. id: true,
  65. name: true,
  66. lastname: true,
  67. email: true,
  68. profileImage: true,
  69. },
  70. },
  71. },
  72. });
  73. return NextResponse.json(updated);
  74. } catch (error) {
  75. console.error("Error al rechazar cita:", error);
  76. return NextResponse.json({ error: "Error al rechazar cita" }, { status: 500 });
  77. }
  78. }